class Observer {
	constructor (data) {
		this.walk(data)
	}
	walk (data) {
		// 1. 判断data是否为对象
		if (!data || typeof data !== 'object') {
			return
		}
		// 2. 遍历data对象所有属性
		Object.keys(data).forEach(key => {
			this.defineReactive(data, key, data[key])
		})
		
	}
	defineReactive (obj, key, val) {
		let _this = this
		let dep = new Dep()
		this.walk(val)
		
		Object.defineProperty(obj, key, {
			enumerable: true,
			configurable: true,
			get () {
				// 收集依赖
				Dep.target && dep.addSub(Dep.target)
				return val
			},
			set (newValue) {
				if (newValue === val) {
					return
				}
				val = newValue
				_this.walk(newValue)
				// 发布通知
				dep.notify()
			}
		})
	}

	// set (target, key, val) {
	// 	if (isUndef(target) || isPrimitive(target)) {
	// 		warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
	// 	}

	// 	if (Array.isArray(target) && isValidArrayIndex(key)) {
    //         target.length = Math.max(target.length, key)
    //         target.splice(key, 1, val)
    //         return val
	// 	}
		
	// 	if (key in target && !(key in Object.prototype)) {
    //         target[key] = val
    //         return val
	// 	}
		
	// 	const ob = target.__ob__
	// 	if (target._isVue || (ob && ob.vmCount)) {
    //         process.env.NODE_ENV !== 'production' && warn(
    //           'Avoid adding reactive properties to a Vue instance or its root $data ' +
    //           'at runtime - declare it upfront in the data option.'
    //         )
    //         return val
	// 	}
		
	// 	if (!ob) {
    //         target[key] = val
    //         return val
    //     }
    //     defineReactive(ob.value, key, val)
	// }
}